/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package polylifegame.view;

import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.BorderFactory;
import javax.swing.JPanel;
import polylifegame.model.Case;
import polylifegame.model.Environnement;

/**
 *
 * @author epulapp
 */
public class GrilleView extends JPanel {
    
    //<editor-fold defaultstate="collapsed" desc="Variables de classe">
    //Taille de la grille en X
    private Integer sizeX;
    //Taille de la grille en y
    private Integer sizeY;
    //Position en X
    private Integer posX;
    //Position en Y
    private Integer posY;
    //Référence sur les cases de la grille
    private JPanel[][] panelEnvironnement;
    //Référence sur l'environnement courant
    private Environnement environnement;
    //Référence sur la vue principale
    private VuePrincipale currentMainView;
    //Utiliser lors du survol pour savoir si on clique sur une touche de la souris
    private Boolean clicked = false;
    //</editor-fold>
    
    //<editor-fold defaultstate="collapsed" desc="Constructeurs">
    /**
     * Constructeur
     * @param mainView : Vue principal
     * @param env : Environnement courant
     * @param sizeX : Taille X
     * @param sizeY : Taille Y
     */
    public GrilleView(VuePrincipale mainView, Environnement env, Integer sizeX, Integer sizeY){
        
        //Initialisation de la grille
        super(new GridLayout(sizeX,sizeY));
        //Taille de la grille
        this.sizeX = sizeX;
        this.sizeY = sizeY;
        //Position dans la grille
        this.posX = 0;
        this.posY = 0;
        //Initialisation du panel de référence
        this.panelEnvironnement = new JPanel[sizeX][sizeY];
        //this.setBorder(BorderFactory.createLineBorder(Color.black));
        
        //Référence sur environnement courant
        this.environnement = env;
        //Référence sur la vue principale
        this.currentMainView = mainView;
        
        //Initialisation des cases de la grille dans un tableau de référence
        for(posX=0; posX<sizeX; posX++){
            for(posY=0; posY< sizeY; posY++){
                
                //Style de la case
                JPanel jpCase = new JPanel();
                jpCase.setBorder(BorderFactory.createLineBorder(Color.LIGHT_GRAY));
                
                //CONTROLLER DE LA CASE
                jpCase.addMouseListener(new MouseAdapter(){
                    
                    //Attributs privées du controller pour récupérer la position
                    private int listenX = posX;
                    private int listenY = posY;
                    
                    //Activer ou désactiver le JPanel au clic souris
                    @Override
                    public void mousePressed(MouseEvent e) {
                        clicked = true;
                        //Si la case est activée on la désactive
                        if(environnement.getTabCases()[listenX][listenY].getEtatN()){
                            environnement.getTabCases()[listenX][listenY].setEtatN(Boolean.FALSE);
                            panelEnvironnement[listenX][listenY].setBackground(Color.white);
                        }
                        //Sinon on l'active
                        else{
                            environnement.getTabCases()[listenX][listenY].setEtatN(Boolean.TRUE);
                            panelEnvironnement[listenX][listenY].setBackground(Color.green);
                        }
                    }
                    
                    @Override
                    public void mouseReleased(MouseEvent e) {
                        clicked = false;
                    }
                    
                    //Activer les cases au survol souris si activé
                    @Override
                    public void mouseEntered(MouseEvent e) {
                        if(clicked) {
                            //Si le survol est activé dans les options, on active les cases au survol
                            if(currentMainView.getIsMouseOverActivated()){
                                
                                environnement.getTabCases()[listenX][listenY].setEtatN(Boolean.TRUE);
                                panelEnvironnement[listenX][listenY].setBackground(Color.green);
                            }
                        }
                    }
                    
                    
                });
                
                //On ajoute les cases au panel conteneur
                this.panelEnvironnement[posX][posY] = jpCase;
                this.add(this.panelEnvironnement[posX][posY]);
            }
        }
        
    }
    //</editor-fold>
   
    //<editor-fold defaultstate="collapsed" desc="Méthodes de classe">
    /**
     * Mise a jour de la grille
     * @param tabCase
     */
    public void drawGameTable(Case[][] tabCase){
        //Parcours de la grille des cases et mise à jour
        for(int i=0; i<sizeX; i++){
            for(int j=0; j< sizeY; j++){
                
                if(tabCase[i][j].getEtatN())
                    this.panelEnvironnement[i][j].setBackground(Color.green);
                else
                    this.panelEnvironnement[i][j].setBackground(Color.white);
            }
        }
    }
    //</editor-fold>
    
}
